package day06;

import java.util.Arrays;
import java.util.Date;
import java.util.StringJoiner;

/*
String相关的类：
String：字符串
StringBuilder：字符串拼接的类，效率高，单线程使用，多线程不安全。
StringBuffer：字符串拼接的类，效率高，多线程使用，多线程时安全。
StringJoiner：字符串连接
 */
public class Demo04 {
    public static void main(String[] args) {
        String s1 = "Hello world";
        System.out.println("获取指定位置的字符：" + s1.charAt(1)); // e
        System.out.println("某个子串在字符串中是否存在：" + s1.contains("h"));
        System.out.println("某个子串在字符串中是否存在：" + s1.contains("He"));

        System.out.println("转小写：" + s1.toLowerCase());
        System.out.println("转大写：" + s1.toUpperCase());

        // 字符串比较
        s1 = "Hello";
        String s2 = "hello";
        /*
        从头开始比较每个字符，返回第一个不相等的字符差。比如H与h的字符差。
         */
        System.out.println((int) 'h'); // 104
        System.out.println((int) 'H'); // 72
        System.out.println(s2.compareTo(s1)); // s2-s1
        System.out.println(s1.compareTo(s2)); // s1-s2

        s1 = "aab";
        s2 = "aas";
        System.out.println(s2.compareTo(s1)); // s-b
        System.out.println("s-b=" + ('s' - 'b'));

        /*
        字符串格式化：
        %s 占位符，用变量将其替换掉。%s是字符串类型的
        %d 整数类型的
        %f 浮点类型的。
        %s 通用的。
         */
        String name = "张三";
        String gender = "男";
        int age = 10;
        float weight = 40.5123f;
        String info = String.format("姓名：%s，年龄：%d，性别：%s，体重：%.2f",
                name, age, gender, weight);
        System.out.println(info);

        info = String.format("姓名：%s，年龄：%s，性别：%s，体重：%s",
                name, age, gender, weight);
        System.out.println(info);

        /*
        拼接：少量字符串拼接，用 + 或者 concat
         */
        String a = "10";
        String b = "20";
        System.out.println(a + b);
        System.out.println(a.concat(b));

        /*
        大量字符串的拼接，用 + 号效率低
        String：不可变的类。
                "a" 是一个对象。
                "ab" 是另一个对象。
                "1" "1," "1,2"  每次循环会生成新的对象。
                生成大量的临时变量，占用内存，消耗资源多。
         */
        String ret = "";
        Date begin = new Date();
        for (int i = 0; i < 10000; i++) {
            ret = ret + i + ",";
        }
        Date end = new Date();
        System.out.println(ret);
        // 1w : 472 ms
        // 3w : 3789 ms
        // 5w : 7908 ms
        System.out.println("拼接耗时ms：" + (end.getTime() - begin.getTime()));

        /*
        大量字符串的拼接使用StringBuilder
        StringBuilder、StringBuffer 可变的类。
        拼接过程中只有一个对象。

        StringBuffer 多线程时，要保证ret1这个对象没有写冲突，没有锁死等问题，
        有一定的处理，没有 StringBuilder效率高。
         */
        // StringBuilder ret1 = new StringBuilder();
        StringBuffer ret1 = new StringBuffer();
        begin = new Date();
        for (int i = 0; i < 50000; i++) {
            ret1.append(i).append(",");
        }
        end = new Date();
        System.out.println(ret1);
        // 1w : 1ms
        // 3w : 3ms
        // 5w : 5ms
        System.out.println("拼接耗时ms：" + (end.getTime() - begin.getTime()));

        /*
        split join
         */
        String path = "C:\\LearnJava44\\src\\day06\\Demo02.java";
        System.out.println(path);
        // 特殊字符会转义 \\
        String[] temp = path.split("\\\\");
        // 使用 / 符号将其连接起来
        path = String.join("/", temp);
        System.out.println(path);

        String str = "today is a nice day.";
        String[] strTemp = str.split(" ");
        System.out.println(Arrays.toString(strTemp));

        String[] names = {"Tom", "Lily", "Lucy"};
        // 将人名拼接成这样的字符串："Hello, Tom, Lily, Lucy!"
        String z = "Hello, " + String.join(", ", names) + "!";
        System.out.println(z);

        // 连接符，前缀，后缀
        StringJoiner sj = new StringJoiner(", ", "Hello, ", "!");
        for (String n : names) {
            sj.add(n);
        }
        System.out.println(sj);

        // subString
        String str1 = "Hello world";
        System.out.println(str1.substring(0, 5)); // 包含0，不包含5的子串
        System.out.println(str1.substring(6)); // 从开始到结束的子串

        // indexof 在字符串中的位置
        System.out.println(str1.indexOf("o")); //4
        // lastIndexOf 从后开始找，在字符串中的位置
        System.out.println(str1.lastIndexOf("o")); // 7

        // subString lastIndexOf 根据一个文件路径，把文件后缀名取出来。
        path = "C:\\LearnJava44\\src\\day06\\Demo02.java"; //java
        int index = path.lastIndexOf(".");
        String suffix = path.substring(index + 1);
        System.out.println("后缀为：" + suffix);

        path = "C:\\LearnJava44\\aaa.java"; // java
        index = path.lastIndexOf(".");
        suffix = path.substring(index + 1);
        System.out.println("后缀为：" + suffix);

        path = "C:\\LearnJava44\\aaa.txt"; // txt
        index = path.lastIndexOf(".");
        suffix = path.substring(index + 1);
        System.out.println("后缀为：" + suffix);

        path = "C:\\LearnJava44\\a.a.a.txt"; //合法的文件名

        // 字符串判等
        String x = "123";
        String y = new String("123"); // 使用构造方法创建对象。
        System.out.println("x == y :" + (x == y)); // 比较内存地址
        System.out.println(x.equals(y)); // 比较的是值。
        System.out.println(x.equalsIgnoreCase(y)); // 比较时不区分大小写

        x = "abc";
        y = "ABC";
        System.out.println(x.equals(y)); // false
        System.out.println(x.equalsIgnoreCase(y)); // true

        // 比如判断文件的后缀是否java，
        // 这几种情况都支持：java JAVA Java，可以用equalsIgnoreCase来比较
    }
}
